#ifndef HMIGRAPHICSSCENE_H
#define HMIGRAPHICSSCENE_H

#include <QGraphicsScene>
#include "hmielement.h"

// 前置声明
class QGraphicsSceneMouseEvent;
class QGraphicsSceneContextMenuEvent;
class QGraphicsView;
class QKeyEvent;

// 支持图形项创建、键盘快捷键操作、右键菜单等
class HmiGraphicsScene : public QGraphicsScene
{
    Q_OBJECT

public:
    enum Mode
    {
        NORMAL,
        CREATEITEM
    };

    explicit HmiGraphicsScene(QGraphicsView* view, QObject *parent = nullptr);
    // 设置场景运行模式
    void setMode(Mode mode);
    // 设置要创建的组件类型
    void setComponentType(ComponentType type);

signals:
    // 当新组件创建时发出的信号
    void componentCreated(HmiComponent* item);
    // 复制操作请求信号，由Ctrl+C触发
    void copyRequestFromScene();
    // 粘贴操作请求信号，由Ctrl+V或右键菜单触发
    void pasteRequestFromScene(const QPointF& scenePos);
    // 删除操作请求信号，由Delete键触发
    void deleteRequestFromScene();

protected:
    // 重写鼠标按下事件处理函数，用于在CREATEITEM模式下创建新组件
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) override;
    // 重写键盘按下事件处理函数，支持ESC退出创建模式、Delete删除选中项、Ctrl+C复制、Ctrl+V粘贴
    void keyPressEvent(QKeyEvent *keyEvent) override;
    // 重写右键菜单事件处理函数，在空白区域显示粘贴菜单，在图形项上则使用项自身的菜单
    void contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent) override;

private:
    Mode mode_;                   // 场景当前运行模式
    ComponentType componentType_; // 待创建的组件类型
    QGraphicsView* view_;         // 关联的图形视图，用于坐标转换
};

#endif // HMIGRAPHICSSCENE_H
